interface KHTMLElement {
    /**
     * 改变样式，当样式需要还原时使用。
     * @param key 样式键
     * @param compare 当 满足条件 时 会设置 样式值
     * @param value 样式值
     */
    resetStyle(key: keyof CSSStyleDeclaration, compare: (value: string) => boolean, value?: string): KHTMLElement;
}
{
    Object.defineProperty(KHTMLElement.prototype, 'resetStyle', {
        writable: false,
        configurable: false,
        enumerable: false,
        value: U.F.overloading('DOM-resetStyle',
            {
                types: [Etype.string, Etype.function, U.F.argType.optionalValue],
                fn: function (this: KHTMLElement, key: keyof CSSStyleDeclaration, compare: (value: string) => boolean, value: string) {
                    this.elements.forEach(ele => {
                        let cacheable = false;
                        const valueCache = ele.dataset[key];// 取 缓存样式
                        if (typeof valueCache === 'undefined') {// 没有 缓存样式 则 缓存样式
                            cacheable = true;
                            // 判断 直接样式
                        } else if (valueCache === 'undefined') {// 没有原 直接样式 则 判断 直接样式
                        } else {// 有 缓存样式
                            if (compare(valueCache)) {// 缓存样式 满足条件 则 判断 直接样式
                            } else {// 缓存样式 不满足条件 则 还原样式
                                this.setStyle(key, valueCache);
                                return this;
                            }
                        }

                        const valueStyle = this.getStyle(key);// 取 直接样式
                        if (valueStyle !== '') {// 有 直接样式
                            if (cacheable) { ele.dataset[key] = valueStyle };// 缓存 样式
                            if (compare(valueStyle)) {// 直接样式 满足条件 先去除 直接样式
                                // 先去除 直接样式
                                this.setStyle(key, null);
                                // 再 计算样式
                            } else {// 直接样式 不满足条件 则 无需处理
                                return this;
                            }
                        } else {// 没有 直接样式 则 需 计算样式
                            if (cacheable) { ele.dataset[key] = 'undefined'; };// 缓存 样式
                        }

                        const valueCss = new KHTMLElement(ele).getStyle(key, true);// 取 计算样式
                        if (compare(valueCss)) { // 计算样式 满足条件 则 需要 设置 直接样式
                            if (value) {// 有 样式值 设置为 样式值
                                this.setStyle(key, value);// 设置 为 样式值
                            } else {// 无 样式值 设置为CSS标准默认值
                                this.setStyle(key, 'initial');// 设置 为 样式值
                            }
                        } else {// 计算样式 不满足条件 则 无需处理
                        }
                    });
                    return this;
                }
            },
        )
    });
}
